/*
  theatre of project tarot virtuel is a server for a card game.
  Copyright (C) 2015  Vivien Kraus
  
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


/**
   @file serveur/theatre/serveur_theatre.hpp
   @brief Définit un Serveur qui fait semblant de jouer au tarot.
 */

#ifndef SERVEUR_THEATRE_DEFINI

/**
   Empêche les inclusions récursives.
 */
#define SERVEUR_THEATRE_DEFINI

#include "serveur.hpp"
#include "lecteur_scenario.hpp"
#include <QList>
#include <QPair>
#include <QSharedPointer>
#include <string>

/**
   @brief Classe de Serveur de théâtre.
   
   Donne la réplique à chaque client qui se connecte, en suivant le
   scénario prévu à l'avance.
*/
class ServeurTheatre: public Serveur
{
  Q_OBJECT;
public:  
  /**
     @brief Constructeur par défaut.

     Ce constructeur lance le listage sur un port qu'il affiche dans
     la sortie standard.

     @see Serveur::ouvrir_global()
   */
  ServeurTheatre(QObject * parent = 0);
  /**
     @brief Donne le nom du fichier à utiliser comme scénario.

     Ne charge rien maintenant, le fichier sera chargé lors de la
     prochaine connexion, pour permettre de modifier le scénario sans
     avoir à redémarrer le théâtre.

     @param fname Le nom de fichier (en utf-8 unicode s'il vous plaît).
   */
  void utiliser_scenario(const std::string & fname);
public slots :
  /**
     @brief Réaction personnalisée (connexion).

     Charge le fichier de scénario.
     
     @param c : le numéro d'identification du client.
   */
  void reagir_connexion(unsigned int c);
  /**
     @brief Une socket s'est déconnectée.

     Le scénario prend fin.

     @param client Le client qui s'est déconnecté.
   */
  void oublier_socket(unsigned int client);
  /**
     @brief Avance dans le scénario.

     @param client Le client qui énonce une réplique.
     @param m Un message.

     Tente d'avancer le scénario.
   */
  void lire(unsigned int client, Protocole::Message m);
private:
  QList<QPair<unsigned int, QSharedPointer<LecteurScenario> > > scenarii;
  std::string fname; //du scénario
private slots:
  void transmettre_scenar(Protocole::Message m);
  void erreur_scenar(Protocole::Message recu, Protocole::Message attendu);
  void hors_scenar(Protocole::Message m);
};

#endif
